mktime関数は、tm構造体と呼ぶ構造体に格納されている日時情報を、紀元(1970年1月1日00:00:00 UTC)からの経過秒数に変換します。なお、現在の経過秒数はtime関数で直接取得することができますし、日時情報はgmtime関数とlocaltime関数で取得することができます。
#include <time.h>
time_t mktime(struct tm *tm);
*tmは日時情報が格納されているtm構造体を指定します。
戻り値として、紀元からの経過秒数を返します。エラーの場合は、-1を返します。
tm構造体は<time.h>で定義されており、次のようなメンバーで構成されています。
メンバー名 | 内容 |
---|---|
tm_sec | 秒数で、0から59までの値です。(但し、閏秒のため60までの値は許されます。) |
tm_min | 分数で、0から59までの値です。 |
tm_hour | 真夜中からの通算時間で、0から23までの値です。 |
tm_mday | 月はじめからの日数で、1から31までの値です。 |
tm_mon | 1月からの通算月数で、0から11までの値です。 |
tm_year | 1900年からの通算年数です。 |
tm_wday | 日曜日からの通算日数(曜日)で、0から6までの値です。(0が日曜日です。) |
tm_yday | 1月1日からの通算日数で、0から365までの値です。 |
tm_isdst | 夏時間が有効かどうかのフラグです。正の値ならば夏時間は有効になり、0ならば無効、負の値ならばこの情報には意味がないことを表します。 |
mktime関数は、tm構造体のメンバーのm_wday(月はじめからの日数)とtm_yday(1月1日からの通算日数)は無視します。また、メンバーの値が正しい範囲にない場合は正規化されます。(例えば、10月40日は11月9日に変更されます。)
プログラム 例
#include <stdio.h> #include <time.h> int main() { time_t timep; struct tm time_inf; struct tm *time_ptr; int year; int mon; int day; char *week_jp[] = {'日', '月', '火', '水', '木', '金', '土', }; printf('年/月/日を入力してください ==> '); scanf('%d/%d/%d', &year, &mon, &day); /* tm構造体の設定 */ time_inf.tm_sec = 1; /* 秒 */ time_inf.tm_min = 0; /* 分 */ time_inf.tm_hour = 0; /* 時間 */ time_inf.tm_mday = day; /* 日 */ time_inf.tm_mon = mon - 1; /* 月 */ time_inf.tm_year = year - 1900; /* 年 */ time_inf.tm_wday = 0; /* 曜日 */ time_inf.tm_yday = 0; /* 年内通算日 */ time_inf.tm_isdst = 0; /* 夏時間 */ /* 紀元からの経過秒数に変換 */ if ((timep = mktime(&time_inf)) != (time_t)-1) { /* 経過秒数からtm構造体に変換 */ time_ptr = localtime(&timep); printf('%4d/%02d/%02dは%s曜日です\n', time_ptr->tm_year + 1900, time_ptr->tm_mon + 1, time_ptr->tm_mday, week_jp[time_ptr->tm_wday]); } else { printf('年/月/日が不当です\n'); } return 0; }
例の実行結果
$ ./mktime.exe 年/月/日を入力してください ==> 2008/7/30 2008/07/30は水曜日です $ $ ./mktime.exe 年/月/日を入力してください ==> 2008/7/32 2008/08/01は金曜日です $ $ ./mktime.exe 年/月/日を入力してください ==> 2008/12/31 2008/12/31は水曜日です $